package core

import (
	"fmt"
	"sync"
)

/*
一个网格，用于存储地图上的物体
*/
type Grid struct {
	// 网格ID
	GID int
	// 网格左边界坐标
	MinX int
	// 网格右边界坐标
	MaxX int
	// 网格上边界坐标
	MinY int
	// 网格下边界坐标
	MaxY int
	// 当前网格内玩家或物体成员的ID集合
	playerIDs map[int]bool
	// 保护当前集合的锁
	playerIDsLock sync.RWMutex
}

// 初始化当前网格的方法
func NewGrid(gID, minX, maxX, minY, maxY int) *Grid {
	return &Grid{
		GID:       gID,
		MinX:      minX,
		MaxX:      maxX,
		MinY:      minY,
		MaxY:      maxY,
		playerIDs: make(map[int]bool),
	}
}

// 给当前网格添加一个玩家
func (g *Grid) Add(playerID int) {
	g.playerIDsLock.Lock()
	defer g.playerIDsLock.Unlock()

	g.playerIDs[playerID] = true
}

// 从当前网格删除一个玩家
func (g *Grid) Remove(playerID int) {
	g.playerIDsLock.Lock()
	defer g.playerIDsLock.Unlock()

	delete(g.playerIDs, playerID)
}

// 获取当前网格中所有玩家的ID
func (g *Grid) GetPlayerIDs() (playerIDs []int) {
	g.playerIDsLock.RLock()
	defer g.playerIDsLock.RUnlock()

	for playerID := range g.playerIDs {
		playerIDs = append(playerIDs, playerID)
	}
	return
}

// 调试 使用fmt.Println()打印网格信息
func (g *Grid) String() string {
	return fmt.Sprintf("Grid id: %d, minX: %d, maxX: %d, minY: %d, maxY: %d, playerIDs: %v",
		g.GID, g.MinX, g.MaxX, g.MinY, g.MaxY, g.playerIDs)
}
